Skip to content

Comments

Update timing defaults in forecasting schema#1974

Merged
Flix6x merged 151 commits intofeat/optional-training-startfrom
dev/new-forecasting-defaults
Feb 23, 2026
Merged

Update timing defaults in forecasting schema#1974
Flix6x merged 151 commits intofeat/optional-training-startfrom
dev/new-forecasting-defaults

Conversation

@BelhsanHmida
Copy link
Contributor

@BelhsanHmida BelhsanHmida commented Feb 17, 2026

Description

This PR updates values for forecasting timing parameters so that the expected test cases pass.

Timing defaults

  • predict-period → min(FM planning horizon, max-forecast-horizon)
  • max-forecast-horizon → predict-period
  • forecast-frequency → min(FM planning horizon, predict-period, max-forecast-horizon, retraining-frequency)
  • retraining-frequency → FM planning horizon

Constraint

  • max-forecast-horizon <= predict-period

Changes

  • Add timing defaults to forecasting schema
  • tests expects validation error
  • Ensure all forecasting tests pass

Sign-off

  • I agree to contribute to the project under Apache 2 License.
  • To the best of my knowledge, the proposed patch is not based on code under GPL or other license that is incompatible with FlexMeasures

… min(planning_horizon, data["max_forecast_horizon"])

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
… of timedelta

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…xceed predict_period

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…, predict_period, and max_forecast_horizon

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…s not 48hours since we want New forecast viewpoint every 12 hours

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
@read-the-docs-community
Copy link

read-the-docs-community bot commented Feb 17, 2026

Flix6x and others added 20 commits February 17, 2026 10:52
Signed-off-by: F.N. Claessen <claessen@seita.nl>
…start, end and duration have been passed

Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…assed

Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
BelhsanHmida and others added 25 commits February 23, 2026 12:25
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…tions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…nventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…ntions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…onventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
…ad of 'end' key

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
…nstead of 'end' key

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Copy link
Contributor

@Flix6x Flix6x left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome!

@Flix6x Flix6x marked this pull request as ready for review February 23, 2026 12:22
@Flix6x Flix6x merged commit 4ca1319 into feat/optional-training-start Feb 23, 2026
7 checks passed
@Flix6x Flix6x deleted the dev/new-forecasting-defaults branch February 23, 2026 12:22
Flix6x added a commit that referenced this pull request Feb 23, 2026
* feat: make start_date optional

Signed-off-by: F.N. Claessen <felix@seita.nl>

* docs: stop putting a focus on `start-date`

Signed-off-by: F.N. Claessen <felix@seita.nl>

* feat: start testing timing parameters against ForecasterParametersSchema

Signed-off-by: F.N. Claessen <felix@seita.nl>

* dev: comment out failing test case

Signed-off-by: F.N. Claessen <felix@seita.nl>

* dev: fix commenting out failing test case

Signed-off-by: F.N. Claessen <felix@seita.nl>

* fix: monkeypatch now

Signed-off-by: F.N. Claessen <felix@seita.nl>

* refactor: freeze server_now in every FlexMeasures module

Signed-off-by: F.N. Claessen <felix@seita.nl>

* fix: failing tests (reproduced with `pytest -k "test_user_crud or test_timing_parameters_of_forecaster_parameters_schema"`)

Signed-off-by: F.N. Claessen <felix@seita.nl>

* feat: make end_date optional param

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add optional end_date handling in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* dev: uncomment empty test case. with todo to include every timing parameter in expected_timing_output

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: add changelog entry.

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* Revert "docs: add changelog entry."

This reverts commit d5c77f155a2266ebdd081e7953fd0d3ade829c1c.

* chore: remove dev print statement

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add not timing params giving test case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* test: only end_date given test_case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* test: add comments

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* test: add case for both start and end dates in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* test: end_date and train_period test case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* test: add case for only start date with training period in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* test: add case for only start date with retrain frequency (predict_period)

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* test: add case for start date with training period and retrain frequency (predict_period)

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: correctly ensure start date is before end date in ForecasterParametersSchema validation

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: standardize timestamp floor method to lowercase '1h' because of FutureWarning: 'H' is deprecated

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs(fix): reference training_period instead of max_training_period in forecasting docs.

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: add changelog entry.

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: make end_date option optional in add forecasts.

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: add end_date not none check

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: allow end_date to be nullable in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add pre_load method to drop None values in ForecasterParametersSchema. this allows for default values to be loaded

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: rename train_predict_pipeline to add_forecast for clarity in data_add

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: change formatting of start-date and end-date in changelog

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* properly link ForecasterParametersSchema in OpenAPI specs

Signed-off-by: Nicolas Höning <nicolas@seita.nl>

* fix: validate max_training_period to disallow years and months in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): add save_belief_time to expectations

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: add start_date test case comment

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: add predict start test case comment

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: remove forecast_frequency default because the default is handled in resolve_config

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: remove max-forecast-horizon default value we set default in resolve config

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: add max_forecast_horizon check for retrain_frequency calculation

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: set default retrain_frequency to 48 hours when no end date, max-forecast-horizon or end_date is given

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: calculate n_cycles based on end_date and retrain_frequency_in_hours in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add 'n_cycles' to fields removed in Forecaster class

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): update max-forecast-horizon and forecast-frequency in test_case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): update max_forecast_horizon and forecast_frequency in test cases that they are set to predict_period duration

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): add test case when end date and retrain_frequency are given

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: update description of max_forecast_horizon to reflect dependency on retrain_frequency

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: update predict_period_in_hours to reflect retrain_freq

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): add n_cycles parameter to test expectations

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: regenerate openapi-specs.json

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): increase test end_date to have two cycles

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs(test): add better documentation of expectations for predict and train period for each testcase and number of cycles

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* Update flexmeasures/data/schemas/forecasting/pipeline.py

Co-authored-by: Felix Claessen <30658763+Flix6x@users.noreply.github.com>
Signed-off-by: Mohamed Belhsan Hmida <149331360+BelhsanHmida@users.noreply.github.com>

* fix: fix forecast frequency field description to reflect true default

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* Revert "fix: fix forecast frequency field description to reflect true default"

This reverts commit 286f7a4ab3fe37ab69b67df7e987a88d66200303.

* fix: fix forecast frequency field description to reflect true default

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: validate retrain frequency as a multiple of forecast frequency

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: suppress complexity warning in validate_parameters method

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* dev: specify schema tests cases

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: set default retrain frequency based on planning horizon configuration

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): add test cases

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* Refactor/forecasting parameter datakeys (#1953)

* feat(schema): add data keys for forecasting parameters in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: move data_key before required field

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: replace data_key with - instead of _

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: update openapi-specs.json

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: re run open-api specs json after fix

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: update the trigger forecasts payload example

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add functions to convert between snake_case and kebab-case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: convert snake_case keys to kebab-case in add_forecast parameters

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: update payload keys in test_trigger_and_fetch_forecasts to kebab-case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: convert payload keys in test_forecasting to kebab-case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: use kebab_to_snake function for key assertions in test_forecasting

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: add comment why we turn kebab-case to snake case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): convert model parameter keys to kebab-case in test_train_predict_pipeline

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove debug comment

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: add empty line after import

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: regenerate openapi_specs.json

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: add changelog entry

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: update parameter key from 'as_job' to 'as-job' in SensorAPI

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: rename variable from 'kebab_key' to 'snake_key' for clarity in test

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: update keys in forecasting parameters to use snake_case format

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* Fix parameter cleaning after Marshmallow kebab-case migration (#1961)

* Initial plan

* Add unified copilot environment setup file

Co-authored-by: Flix6x <30658763+Flix6x@users.noreply.github.com>

* docs: add changelog entries for bug fix and environment setup

Co-authored-by: Flix6x <30658763+Flix6x@users.noreply.github.com>

* fix: include last forecast event in get_forecast query

Context:
- Test test_trigger_and_fetch_forecasts was failing with 'P%P' instead of 'PT2H'
- Root cause: event_ends_before excluded the last event from the results
- When forecast period is short, this results in empty/incomplete data

Change:
- Add sensor.event_resolution to event_ends_before parameter
- Ensures all expected forecast events are included in the query
- Matches pattern already used correctly in the test code

Co-authored-by: Flix6x <30658763+Flix6x@users.noreply.github.com>

* revert: remove unnecessary event_ends_before adjustment in forecast API

Context:
- Previous fix added '+ sensor.event_resolution' to event_ends_before parameter
- Investigation revealed this was unnecessary - API behavior was correct
- event_ends_before is INCLUSIVE, so end_date correctly includes events ending at that time

Analysis:
- API correctly returns events with event_end = end_date
- For end_date=02:00 and 1h resolution, events 00:00-01:00 and 01:00-02:00 are correct
- Last event ends exactly at end_date (02:00), which is the expected behavior

Change:
- Reverted event_ends_before back to job.meta.get("end_date")
- Removed the '+ sensor.event_resolution' adjustment

See /tmp/DEBUGGING_FINDINGS.md for full investigation details

* fix(tests): test_forecasting_api now queries correct sensor

Context:
- Test was failing because it queried sensor_1 (solar-sensor-1)
- But API writes forecasts to sensor_0 (solar-sensor, the trigger sensor)
- This caused mismatch: API returned data from sensor_0, test expected data from sensor_1

Root Cause:
- Test used sensor_1 for manual pipeline and database queries
- API uses sensor_0 (the sensor that triggered the forecast endpoint)
- These are different sensors, so data didn't match

Changes:
1. Query sensor_0 instead of sensor_1 in test assertions
2. Remove unnecessary manual pipeline execution
3. Remove unused TrainPredictPipeline import
4. Fix duration calculation to use sensor_0.event_resolution
5. Also removed '+ sensor.event_resolution' from event_ends_before (matches API)

Result:
- Test now passes without any API changes
- Simpler test code (removed manual pipeline complexity)
- Accurate validation of API endpoint behavior

* agents/coordinator: document symmetric fixes anti-pattern

Context:
- Coordinator tracks system-wide patterns and failures
- Session revealed new anti-pattern: symmetric fixes without verification
- Should be documented for future governance oversight

Change:
- Added 'Symmetric fixes without independent verification' pattern
- Documents observation, root cause, and solution
- References updated agent instructions (Test, Review Lead, API)
- Explains why pattern matters for system health

Purpose:
- System-wide awareness of anti-pattern
- Reference for future coordinator reviews
- Verification that agent updates address root cause
- Long-term knowledge capture for agent evolution

* agents/review-lead: add guidance to question symmetric fixes

Context:
- Review Lead orchestrates specialists and synthesizes findings
- Should catch cross-cutting anti-patterns like symmetric fixes
- Session showed need for explicit orchestration guidance

Change:
- Added 'Must Question Symmetric Fixes' section
- Documents what symmetric fixes are and why dangerous
- Provides checklist for identifying and challenging them
- Includes example review comment for specialists
- Integrates with coordination responsibilities

Enables:
- Early detection of symmetric fix patterns in PR reviews
- Coordination between Test and API specialists
- Verification requests using revert-and-re-test pattern
- Minimal changeset enforcement across agents

* agents/api-compatibility: add api change necessity checks

Context:
- API Specialist should minimize unnecessary API changes
- Session showed API change may not have been needed (only test fix)
- Need to verify API changes aren't just test fixes in disguise

Change:
- Added 'API Change Necessity' subsection to Review Checklist
- Documents pattern of unnecessary API fixes
- Provides verification workflow with Test Specialist
- Emphasizes trying test-only fixes first

Protects:
- API consumers from unnecessary changes
- Backward compatibility from spurious modifications
- API surface area from unverified expansions
- Integration stability from side effects

* agents/test-specialist: add revert-and-re-test pattern for symmetric fixes

Context:
- Session revealed pattern where same fix applied to API and test
- Test passing didn't prove both fixes were needed
- Only proved the changes were consistent with each other
- Led to unnecessary API change that may have side effects

Change:
- Added 'Revert and Re-test Pattern (CRITICAL)' section
- Documents why symmetric fixes are dangerous
- Provides step-by-step process to verify each fix independently
- Includes example from session with PT2H duration bug
- Integrates with existing test-driven bug fixing workflow

Prevents:
- Unnecessary production code changes
- API modifications when only test needed fixing
- Side effects from unverified fixes
- Conflating test bugs with production bugs

* agents/review-lead: document 2026-02-07 session learning on symmetric fixes

Context:
- Made unnecessary API fix without independent verification
- Applied same fix to both API and test
- Test passed, concluded both fixes needed
- User correctly identified API fix was unnecessary

Change:
- Document failure pattern and prevention
- Added key insight about symmetric fixes
- Links to new 'Must Question Symmetric Fixes' section
- Emphasizes revert-and-re-test verification

* fix: update _clean_parameters to use kebab-case keys

Context:
- PR #1953 changed parameter keys from snake_case to kebab-case
- ForecasterParametersSchema uses data_key with kebab-case (e.g., 'as-job', 'sensor-to-save')
- _clean_parameters was still trying to remove snake_case keys
- This caused parameters like 'as-job' and 'sensor-to-save' to persist in DataSource attributes
- test_trigger_and_fetch_forecasts was failing because API-triggered and direct forecasts had different data sources

Change:
- Updated fields_to_remove list in _clean_parameters to use kebab-case:
  - as_job -> as-job
  - sensor_to_save -> sensor-to-save
  - end_date -> end-date
  - max_forecast_horizon -> max-forecast-horizon
  - forecast_frequency -> forecast-frequency
  - model_save_dir -> model-save-dir
  - output_path -> output-path
- Added comment explaining kebab-case format comes from Marshmallow schema
- Noted that n_cycles still uses snake_case (computed internally, not from schema)
- Updated docstring to reflect kebab-case keys

Fix:
- test_trigger_and_fetch_forecasts now passes
- Both API-triggered and direct forecasts now have same cleaned parameters
- Data sources are properly matched based on cleaned attributes

* agents/test-specialist: learned parameter format consistency and test design intent

Context:
- Session 2026-02-08 initially misunderstood test_trigger_and_fetch_forecasts
- Nearly "fixed" the test when the real bug was in production code
- Test was intentionally using different sensors to validate same data source
- Real bug: _clean_parameters used snake_case but parameters were kebab-case

Change:
- Added "Understanding Test Design Intent" section with case study
- Documented red flags for changing tests without understanding intent
- Added "Parameter Format Consistency" section with Marshmallow pattern
- Explained how data_key in schemas changes parameter dictionary keys
- Documented the bug pattern and fix approach
- Emphasized investigating production code before changing tests

Key Lessons:
- Read test design and intent before changing tests
- Check Marshmallow schema data_key for actual parameter format
- Failing tests often reveal real production bugs, not test bugs
- Use grep to verify actual parameter keys in use

* agents/review-lead: learned to investigate test design intent before changing tests

Context:
- Session 2026-02-08 revealed previous session wrongly changed test
- Real bug was in production code (_clean_parameters format mismatch)
- Test design was intentionally using different sensors to check consistency
- User explained test validates API and direct computation create same data source

Change:
- Added 'Must Understand Test Design Intent Before Changing Tests' section
- Comprehensive guidance on investigating before changing tests
- Decision tree for test vs production fixes
- Case study from test_trigger_and_fetch_forecasts
- Coordination patterns with Test Specialist
- Updated failure log with 2026-02-08 lesson
- Key insight: 'Failing tests often reveal production bugs, not test bugs'

* agents/coordinator: track Marshmallow schema migration patterns

Context:
- PR #1953 changed parameters to kebab-case via Marshmallow data_key
- _clean_parameters not updated, causing silent failures
- Schema format changes affect multiple code paths (cleaning, access, storage)
- Session 2026-02-08 revealed this as systemic pattern

Change:
- Added 'Schema Migration Patterns' subsection to Domain Knowledge
- Documented Marshmallow data_key change pattern with example
- Listed 5 code paths affected by schema format changes
- Created detection methods (grep patterns, inspection queries)
- Defined agent responsibilities matrix for schema migrations
- Added checklist for reviewing schema format migration PRs
- Included case study from test_trigger_and_fetch_forecasts bug
- Key insight: Tests comparing data sources detect format mismatches

* agents/api-backward-compatibility: add parameter format consistency checks

Context:
- Marshmallow schema data_key changes affect API behavior
- Parameter cleaning must match schema output format (dict keys, not Python attributes)
- Session 2026-02-08 revealed format mismatch bug in _clean_parameters
- PR #1953 migration to kebab-case required code updates

Change:
- Added 'Parameter Format Consistency' subsection to Schema Changes
- Documented schema format migration pattern with code examples
- Added 5-item checklist for parameter format verification
- Included verification steps (schema lookup, dict inspection, code audit)
- Case study from test_trigger_and_fetch_forecasts bug
- Cross-agent coordination guidance with Test and Architecture specialists
- Emphasizes using data_key format, not Python attribute names

* agents/architecture-domain: enforce schema-code consistency invariant

Context:
- Marshmallow schemas are source of truth for parameter format
- Code must match schema output (data_key values), not Python attributes
- Format mismatches cause silent bugs (parameters not cleaned/accessed correctly)
- Session 2026-02-08 revealed _clean_parameters using wrong format

Change:
- Added 'Schema-Code Consistency' checklist section after Architectural Principles
- Defined domain invariant: 'Schema as Source of Truth for Parameter Format'
- Documented schema format migration pattern (before/after data_key)
- Listed code paths to audit (cleaning, access, storage, comparison)
- Added enforcement guidance with 5-step verification process
- Case study from test_trigger_and_fetch_forecasts bug
- Code examples showing correct vs incorrect dictionary operations
- Related files reference for schema handling

* docs: remove obsolete changelog entries

Signed-off-by: F.N. Claessen <felix@seita.nl>

* Revert "fix(tests): test_forecasting_api now queries correct sensor"

This reverts commit 84b9ff4ab627eba9a06b6d8425dd17cd4d3acf61.

* Revert "agents/api-compatibility: add api change necessity checks": preferring to adapt the test rather than fixing the schema is just terrible advice

This reverts commit a1e84fbaef46fef7a501cdf5adcbfa2e4e80af35.

* Revert "agents/coordinator: document symmetric fixes anti-pattern": no such 'symmetric fixes' pattern discovered in agent session

This reverts commit dbf22f5fb9bdd55abf7ca4b0a0216d8ecddbc792.

* Revert "agents/review-lead: add guidance to question symmetric fixes": no such 'symmetric fixes' pattern discovered in agent session

This reverts commit e4e6708b9e6a1b2110909bc5ecc2011052d26145.

* Revert "agents/review-lead: document 2026-02-07 session learning on symmetric fixes": no 'symmetric fixes' observed

This reverts commit 265043e8

Signed-off-by: F.N. Claessen <felix@seita.nl>

* Revert "agents/test-specialist: add revert-and-re-test pattern for symmetric fixes": no 'symmetric fixes' observed

This reverts commit c59a640bf615c3469f1c6a1b53230ca82d9ffb98.

* fix: the copilot-setup-steps job requires a specific name

Signed-off-by: F.N. Claessen <felix@seita.nl>

---------

Signed-off-by: F.N. Claessen <felix@seita.nl>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Flix6x <30658763+Flix6x@users.noreply.github.com>
Co-authored-by: F.N. Claessen <felix@seita.nl>

* Feat/forecasting parameter single source (#1955)

* feat(cli): add decorator to add CLI options from Marshmallow schema fields

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add cli option schema fields metadata.

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* dev: integrate ForecasterParametersSchema and add CLI options from schema using add_cli_options_from_schema decorator

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove commented out max-training-period from cli params

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove commented out sensor from cli params

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove commented out params which have same descriptions in schema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: adjust docstring formatting in add_cli_options_from_schema function

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: update max-forecast-horizon description to use ISO 8601 format to show input format

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: update descriptions for future, past, and general regressors in ForecasterParametersSchema. maybe future and past regressors isn't clear for users

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: support multiple option names and aliases in add_cli_options_from_schema function

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add aliases for CLI options in ForecasterParametersSchema

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove commented-out CLI options for training period and retrain frequency in data_add.py

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: clean up dev comments for params that are going to stay

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove unused import of call back function for regressors cli param

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: remove empty lline

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: prefer splitting up sentences after punctuation

Signed-off-by: F.N. Claessen <felix@seita.nl>

* style: simplify phrasing

Signed-off-by: F.N. Claessen <felix@seita.nl>

* chore: update openapi-specs.json

Signed-off-by: F.N. Claessen <felix@seita.nl>

* fix: spacing in autogenerated CLI option help texts

Signed-off-by: F.N. Claessen <felix@seita.nl>

* fix: finish sentence

Signed-off-by: F.N. Claessen <felix@seita.nl>

* feat: stop exposing CLI-exclusive fields via the API

Signed-off-by: F.N. Claessen <felix@seita.nl>

* fix: help IDE understand the return type of get_data_generator is a Forecaster or Reporter depending on the passed data_generator_type

Signed-off-by: F.N. Claessen <felix@seita.nl>

* chore: regenerate openapi-specs.json

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: update keys in forecasting parameters to use snake_case format

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: Enhance dd_cli_options_from_schema with examples, and extra help

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: Update forecast frequency description

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: Add extra help for missing-threshold CLI option

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: Add extra help for max-forecast-horizon CLI option

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove commented out cli options

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: regenerate openapi-specs.json

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: keep DEPRECATED cli params in add forecasts cli command

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix(api): restore ForecasterParametersSchema in trigger_forecast parser

forecaster_parameters_schema_openAPI is an OpenAPI/docs-only schema.
Using it in @use_args dropped CLI-exclusive fields and removed schema hooks (pre_load, validates_schema, post_load), which changed runtime behavior and caused forecasting API failures (422 on valid payloads and 500 due to missing derived sensor_to_save in permission checks).

This change restores ForecasterParametersSchema() for runtime request parsing while keeping forecaster_parameters_schema_openAPI for documentation generation, preserving both correct endpoint behavior and cleaned OpenAPI output.

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: regenerate openapi-specs.json

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: bring back the field types in CLI --help again

Signed-off-by: F.N. Claessen <claessen@seita.nl>

---------

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: Mohamed Belhsan Hmida <149331360+BelhsanHmida@users.noreply.github.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Co-authored-by: F.N. Claessen <felix@seita.nl>
Co-authored-by: F.N. Claessen <claessen@seita.nl>

---------

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: Mohamed Belhsan Hmida <149331360+BelhsanHmida@users.noreply.github.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Co-authored-by: F.N. Claessen <felix@seita.nl>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Flix6x <30658763+Flix6x@users.noreply.github.com>
Co-authored-by: F.N. Claessen <claessen@seita.nl>

* docs: remove "internal" PR from changelog (became part of PR #1917)

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: make PR #1917 part of a single changelog entry, which introduces the forecasting API and makes all timing parameters optional

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: update test input

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: move as-job out of the parameters schema

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: update test

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: ensure backwards compatibility with DataGenerator subclasses whose _compute function do not support the as_job kwarg.

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: pass original instantiated fields instead of re-instantiating them

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: prevent TrainPredictPipeline from catching exceptions and hiding error messages

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: prevent empty forecast from being returned silently

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: set load_default for ensure-positive

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: parameters are already deserialized, so use **kwargs

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: move regressors to config

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: load_default of regressor lists

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* style: black

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* chore: update openapi-specs.json

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: forecasting trigger schema

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: update test comments

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: modify data rather than return new dict (this makes it easier to add new fields)

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: move missing-threshold to config

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: move ensure-positive to config

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* delete: obsolete fields from parameters post_load

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: check DataGenerator parameters explicitly

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* style: flake8; remove obsolete imports

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: prevent PredictPipeline from catching exceptions and hiding error messages

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: prevent TrainPipeline from catching exceptions and hiding error messages

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: expect the original ValueError instead of the CustomException

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: prevent BasePipeline from catching exceptions and hiding error messages

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: use an existing custom error that is more to the point

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* remove: obsolete exception class and util

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: move over all config fields from CLI options to Forecaster config

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: suppress complexity warning for add_forecast function

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* Update timing defaults in forecasting schema (#1974)

* feat: make predict retrain-frequency default to planning horizon then min(planning_horizon, data["max_forecast_horizon"])

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor:  simplify end_date calculation to use predict_period instead of timedelta

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: default max_forecast_horizon to predict_period

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add validation for max_forecast_horizon to ensure it does not exceed predict_period

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: set default forecast_frequency based on min of planning_horizon, predict_period, and max_forecast_horizon

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: add planning horizon from config

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* dev: uncomment out tests that were failing

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: fix test cae forecast_frequency expectation it should be 12 hours not 48hours since we want New forecast viewpoint every 12 hours

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: tests should expect 5 cycles. the test passes when we expect 1cycle

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: add duration to schema

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: pass original data to `resolve_config` so we can check whether start, end and duration have been passed

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: move end_date calculation up

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: fix max-forecast-horizon and forecast freq default calculation

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* dev: remove breakpoint

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: throw ValidationError in case start, end and duration are all passed

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: remove unneeded validation

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: move check to pre_load

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* dev: comment out tests cases that pass

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: fix calculation for retrain_freq

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* Revert "dev: comment out tests cases that pass"

This reverts commit 9e7acc903ae9d4e07c8fe9852c2b790f4200d3b8.

* style: run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: regenerate openapi-spec.json

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: move parametrized cases next to case descriptions

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* dev: remove breakpoint

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: check predict period

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: case 1

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: improve error message for failing test cases

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* dev: case 2 needs further investigation

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: case 4

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: partially fix case 5

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* dev: case 5 needs further investigation

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: case 6

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* dev: comment out test cases that need further investigation, and preferably these should also become enumerated cases with similarly annotated expectations

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: move the documented defaults and choices for timing parameters to the post_load docstring where these are actually acted upon

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: correctly set retrain_frequency_in_hours

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: streamline job metadata handling in run method to prevent undefined variable issue

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: rename parameter name to match field name

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: stop mixing up retrain-frequency and predict-period

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: false variable name

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* style: black

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: cap retrain-frequency to not exceed predict-period

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: incomplete schema renaming

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: exclude CLI-specific fields from API schema

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: clarify what happens to the source ID if you change the forecaster config

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: change target_sensor reference from target to sensor

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: update test case 4 comment and expectations. we expect 4 cycles because of retrain_frequency and predict_period

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: update cycle frequency calculation to use retrain_frequency instead of predict_period

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: search sensor forecasts (the ones computed directly not via api) by source forecaster type since the source isn't the same as one generated by api.

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: adjust event end date calculation in forecast belief search to exclude sensor resolution

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: move cycle_frequency variable outside for loop

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: update predict_end calculation to use cycle_frequency instead of predict_period_in_hours

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: use default value for probabilistic in ForecasterParametersSchema this fixes issue when we call via api this param default isn't loaded

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove unused import and run pre-commit

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat(test): update test case to only one day of prediction

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: add forecast_frequency to test params

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove old commented out test case

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* dev: uncomment out test cases

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: remove default value for probabilistic when calling with get

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: update test case comment

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: calculate pred start date from end date and duration

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: remove planning horizon from forecast frequency calculation and default retrain_frequency to  predict_period

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix(tests): updates test cases

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: annotate case 7

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix(test): update forecast_frequency in tests

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: annotate case 8

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: enumerate remaining test cases

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix(tests): add start-predict-date  to case 3

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: clarify case 0

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: add comment

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* docs: check retraining-frequency in case 1

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: enumerate defaults and choices

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: add docstring

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* fix: case 2

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: explain case 3 slightly better

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: set load_default for the retrain-frequency and make it independent of any parameters, because it will be moved to the config, and we don't want to let changing parameters lead to new data source IDs

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: base the number of cycles on the retrain-frequency and the forecast-frequency, whichever is larger, and ensure there is always at least 1 cycle

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: // guarantees an int already

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* delete: validator no longer appropriate

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: raise in case of explicitly setting inconsistent variables that would result in incomplete coverage for the prediction window

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: check retrain-frequency explicitly

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: explain number to devs

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* style: black

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: update test expectations and add another test case

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: only update default predict-period in case a forecast-frequency was not set explicitly

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* delete: obsolete variable

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: we are now guaranteed one cycle, and it is allowed to be smaller than the retrain-frequency

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: counter in train_predict_params starts at 1

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* dev: better error messages

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: update test case that tries to get two cycles out of the API

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: expose forecast-frequency to API users

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: update forecast-frequency default description

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: add comment

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: add docstring

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: update comment for selecting a default predict-period

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: remove code after merge conflict

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* style: move flake8 noqa

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* test(docs) update test comments

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: move retrain-frequency to config

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat(test): uncomment and fix dates params

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: ensure a retrain-frequency of at least 1 hour

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: n_cycles now determined outside of schemas

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: update test coverage of ForecasterParametersSchema

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* dev: partial fix for failing test

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: test_missing_data_logs_warning

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: test_train_period_capped_logs_warning

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: test_trigger_and_fetch_forecasts

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: remove sensor from documented payload (it's in the URI path already)

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: move training timing fields from parameters to config

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: do not store any forecaster parameters by default

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: move derivation of training period into class method, and add a docstring

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: simplify logic for deriving the training period

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* style: flake8

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* chore: update openapi-specs.json

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: remove CLI-only fields from nested config, too

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: remove end-date and training timing fields from API docs

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor: rename start-predict-date to start

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: change start-date to train-start

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: change end-date to end

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: update forecasting job JSON keys to match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: update forecasting trigger schema keys to match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: update job metadata keys to match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: update forecasting job metadata keys to match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor: update forecasting parameter keys to match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor(test): update forecast job payload and job metadata keys to match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* doc: fix comment typo

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor(tests): update test cases to use 'end' and 'train-start' keys

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* chore: update field names in comments

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor(tests): update date keys in test cases to match new naming conventions

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* style: black

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* refactor(doc): update forecasting job example to use 'duration' instead of 'end' key

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* refactor(api): update forecasting trigger example to use 'duration' instead of 'end' key

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>

* feat: remove max-forecast-horizon field from API docs

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: fix typo

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* chore: update openapi-specs.json

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: clarify mention of planning horizon in forecast duration field

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: clarify use case for forecast-frequency field

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* feat: expose duration field to the CLI

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* docs: capitalize start of sentence

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* fix: (CLI) description of end field

Signed-off-by: F.N. Claessen <claessen@seita.nl>

* style: flake8

Signed-off-by: F.N. Claessen <claessen@seita.nl>

---------

Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Co-authored-by: F.N. Claessen <claessen@seita.nl>

* docs: CLI changelog entry

Signed-off-by: F.N. Claessen <claessen@seita.nl>

---------

Signed-off-by: F.N. Claessen <felix@seita.nl>
Signed-off-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Signed-off-by: Nicolas Höning <nicolas@seita.nl>
Signed-off-by: Mohamed Belhsan Hmida <149331360+BelhsanHmida@users.noreply.github.com>
Signed-off-by: F.N. Claessen <claessen@seita.nl>
Co-authored-by: Mohamed Belhsan Hmida <mohamedbelhsanhmida@gmail.com>
Co-authored-by: Nicolas Höning <nicolas@seita.nl>
Co-authored-by: Mohamed Belhsan Hmida <149331360+BelhsanHmida@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants